package com.nai365.nart.operation.service;

import com.nai365.nart.operation.dto.SpuDto;
import com.nai365.nart.product.entity.Category;
import com.nai365.nart.product.entity.SkuInfo;
import com.nai365.nart.product.entity.SpuInfo;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 产品服务，调用远程接口
 */
public interface ProductService {

	/**
	 * 根据Id查询 Spu
	 *
	 * @param id spu id
	 * @return SpuInfo
	 */
	SpuInfo findSpuById(Long id);

	/**
	 * 根据 spu id 列表查询 spu dto
	 *
	 * @param ids spu id 列表
	 * @return spu dto map
	 */
	Map<Long, SpuDto> getSpuInfoMapByIds(List<Long> ids);

	/**
	 * 根据spu 状态查询 我的sku
	 *
	 * @param spuId  spuId
	 * @param status 状态
	 * @return Sku列表
	 */
	List<SkuInfo> findMySkuBySpuIdAndStatus(Long spuId, Integer status);

	/**
	 * 锁定一个可用的sku
	 *
	 * @param spuId spu id
	 * @return SkuInfo
	 */
	SkuInfo lockSkuInfo(Long spuId) throws Exception;

	/**
	 * 解锁一个可用的sku
	 *
	 * @param skuInfo spu
	 * @return SkuInfo
	 */
	SkuInfo unLockSkuInfo(SkuInfo skuInfo) throws Exception;

	/**
	 * 根据id集合查询sku列表
	 *
	 * @param ids id集合
	 * @return List<SkuInfo>
	 */
	List<SkuInfo> findSkuByIds(Collection<Long> ids);

	/**
	 * 查询所有列表
	 *
	 * @return 列表Map
	 */
	Map<Long, Category> getAllCategoryMap();

	/**
	 * 修改Sku
	 *
	 * @param skuInfo sku
	 */
	void updateSku(SkuInfo skuInfo);


	/**
	 * 修改Sku,内部调用
	 *
	 * @param skuInfo sku
	 */
	void updateSkuInner(SkuInfo skuInfo);

	/**
	 * 批量更新Sku
	 *
	 * @param skuInfoList sku列表
	 * @return sku列表
	 */
	List<SkuInfo> updateBatchSkuInfo(List<SkuInfo> skuInfoList) throws Exception;

	/**
	 * 根据Id查询 Sku
	 * @param id sku id
	 * @return SkuInfo
	 */
	SkuInfo findSkuById(Long id) throws Exception;

	/**
	 * 根据Id查询 Sku
	 * @param id sku id
	 * @return SkuInfo
	 */
	SkuInfo findSkuByIdInner(Long id) throws Exception;
}
